package fr.babos.graphic.tools 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import org.bytearray.display.ScaleBitmap;
	
	/**
	 * @author ZoulouX
	 */
	public class AutoScaleNine extends ScaleBitmap
	{
		/**
		 * Le bitmapData associé
		 */
		override public function set bitmapData (value:BitmapData):void
		{
			// Si on a un bitmapData, le parser
			if (value != null)
				value = parseBitmapData(value);
			
			// Enregistrer
			super.bitmapData = value;
			
			// Actualiser le rectangle
			if (value != null)
				scale9Grid = _scale9Grid;
		}
		
		
		/**
		 * Le constructeur
		 * @param	pBitmapData : Le bitmapData 
		 * @param	pPixelSnapping : Si le bitmap doit snapper les pixels selon la matrice de transformation
		 * @param	pSmoothing : Si le bitmap doit lisser l'image
		 */
		public function AutoScaleNine (pBitmapData:BitmapData = null, pPixelSnapping:String = "auto", pSmoothing:Boolean = false)
		{
			// On parse le bitmap
			if (pBitmapData != null)
				pBitmapData = parseBitmapData(pBitmapData);
			
			// Relayer
			super(pBitmapData, pPixelSnapping, pSmoothing);
			
			// Actualiser le rectangle
			if (pBitmapData != null)
				scale9Grid = _scale9Grid;
		}
		
		/**
		 * Parser le bitmapData
		 */
		public function parseBitmapData (pBitmapData:BitmapData):BitmapData
		{
			// La moyenne de détéction
			var detectThreshold:uint = 0x777777;
			
			// Récupérer le scale horizontal de gauche
			var x1:uint = 1;
			while (pBitmapData.getPixel(x1, 0) > detectThreshold && x1 < pBitmapData.width)
			{
				// On va vers la droite
				x1 ++;
			}
			
			// Récupérer le scale horizontal de droite
			var x2:uint = pBitmapData.width - 1;
			while (pBitmapData.getPixel(x2, 0) > detectThreshold && x2 > 1)
			{
				// On va vers la gauche
				x2 --;
			}
			
			// Récupérer le scale vertical du haut
			var y1:uint = 1;
			while (pBitmapData.getPixel(0, y1) > detectThreshold && y1 < pBitmapData.height)
			{
				// On va vers le bas
				y1 ++;
			}
			
			// Récupérer le scale vertical du haut
			var y2:uint = pBitmapData.height - 1;
			while (pBitmapData.getPixel(0, y2) > detectThreshold && y2 > 1)
			{
				// On va vers le haut
				y2 --;
			}
			
			// On décalle tout d'1px (car on va supprimer les markers)
			x1 --;
			x2 --;
			y1 --;
			y2 --;
			
			// Enregistrer le rectangle
			_scale9Grid = new Rectangle(x1, y1, x2 - x1, y2 - y1);
			
			// On copie (pour supprimer les markers)
			var newBitmapData:BitmapData = new BitmapData(pBitmapData.width - 1, pBitmapData.height - 1, pBitmapData.transparent, 0x00000000);
			
			// On fait une translation de -1 pour supprimer les markers
			var matrix:Matrix = new Matrix();
			matrix.translate(-1, -1);
			
			// On redessiner sans les markers
			newBitmapData.draw(pBitmapData, matrix, null, null, null, smoothing);
			
			// On retourne le nouveau bitmapData
			return newBitmapData;
		}
	}
}